#include "Algorithm_ProfixPostfix.h"

/*
中缀表达式求值
1.转成后缀表达式
2.从左向右扫描
    扫到操作数 入栈
    扫到运算符 弹出2个栈顶元素运算得出结果 入栈

备注：
    这里的栈默认每个操作数只占1个字符空间，所以计算过程和结果只能是一位数
    在中缀转后缀算法里没问题 ，如15这个两位数被当做1和5两个操作数 被直接弹出和15效果一样
    但运算时如15被当做两个操作数压入栈中，弹出并运算。显然不对。
*/

bool PostfixCaculate(char Pstr[], int &result)
{
    Stack S;
    InitStack(S);

    for(int i=0; i<strlen(Pstr); i++)  // 扫描
    {
        char c = Pstr[i];
        if(c=='+' || c=='-' || c=='*' || c=='/')
        {
            char ca, cb, cr;
            Pop(S, ca);
            Pop(S, cb);

            int a, b, r;  // 字符型转int型
            b = ca - '0';  // 先弹出的为后操作数
            a = cb - '0';

            if(c == '+')  // 进行相应运算
            {
                r = a+b;
            }
            else if(c == '-')
            {
                r = a-b; 
            }
            else if(c == '*')
            {
                r = a*b;
            }
            else if(c == '/')
            {
                r = a/b;
            }
            result = r;

            cr = r + '0';  // 运算结果入栈
            Push(S, cr);
        }
        else
        {
            Push(S, c);  // 操作数入栈
        }
        
    }
    return true;
}

void test_ic()
{
    char instr[Maxsize];
    char Pstr[Maxsize];  // 存放后缀表达式
    int result;

    puts("Please input a infix str:");
    scanf("%s", &instr);

    TransPostfix(instr, Pstr);

    puts("The postfix str:");
    printf("%s", Pstr);

    PostfixCaculate(Pstr, result);

    puts("\nThe Caculate result:");
    printf("%i", result);
}

int main()
{
    test_ic();
    return 0;
}


